home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume2
/
libraris
/
gimme.1
next >
Wrap
Internet Message Format
|
1988-12-02
|
58KB
Path: xanth!ames!nrl-cmf!ukma!rutgers!mit-eddie!ll-xn!adelie!infinet!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v02i074: gimme.lib - misc library routines, Part01/07
Message-ID: <10412@swan.ulowell.edu>
Date: 2 Dec 88 00:58:14 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 1678
Approved: page@swan.ulowell.edu
Submitted-by: oscvax!jan@uunet.UU.NET (Jan Sven Trabandt)
Posting-number: Volume 2, Issue 74
Archive-name: libraries/gimme.1
Gimme.lib is a bunch of routines I've grouped together over the year
and is particularly useful for dealing with Intuition structures as
well as some devices. It's a (Manx) library to be linked in to a
program.
Look at the file "gimmefuncs.h" to see the function prototypes
for the whole kit-and-kaboodle (there are around 120 functions).
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# DOCS.part1
# This archive created: Thu Dec 1 19:44:20 1988
cat << \SHAR_EOF > DOCS.part1
/*
* NAME: gimmeBitMap
*
* SYNOPSIS: bm = gimmeBitMap( depth, width, height );
* struct BitMap *bm;
*
* INPUTS: SHORT depth; number of required bitplanes
* SHORT width; number of columns wide in pixels
* SHORT height; number of rows high in pixels
*
* DESCRIPTION: Allocate and initialize/clear a BitMap struct.
* If the depth, width and height parameters are strictly positive,
* the required bit-planesare allocated as well, and the BitMap
* is properly initialized,
* otherwise the BitMap is cleared.
*
* RESULTS: Returns pointer to a BitMap, or NULL if anything went wrong.
*
* SEE ALSO: getRidOfBitMap
*/
/*
* NAME: getRidOfBitMap
*
* SYNOPSIS: err = getRidOfBitMap( bitmap );
* short err;
*
* INPUTS: struct BitMap *bitmap; pointer to initialized bitmap
*
* DESCRIPTION: Deallocate memory for a bitmap, including bitplanes.
* Number of bitplanes determined from bitmap.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeBitMap
*/
/*
* NAME: gimmeBitPlanes
*
* SYNOPSIS: flags = gimmeBitPlanes( bm, myflags );
* ULONG flags;
*
* INPUTS: struct BitMap *bm; ptr to initialized BitMap
* ULONG myflags; flags for routine
*
* DESCRIPTION: Allocate bit-plane(s) given an initialized BitMap struct,
* according to the flags:
* - contiguous - all planes allocated contiguously,
* as required for Image data
* - separate - all planes allocated individually
* - default - try contiguous first, then separate
*
* Note: the "initialized" BitMap struct should not have any
* planes allocated for it prior to this call, as the plane
* pointers are stored in the BitMap's Planes[] field.
*
* RESULTS: Returns actual flags used.
* Check if bm->Planes[0] is non-NULL to see if successfull,
* or if the returned flags equals the error flag defined in
* bitplane.h
*
* SEE ALSO: getRidOfBitPlanes
*/
/*
* NAME: getRidOfBitPlanes
*
* SYNOPSIS: err = getRidOfBitPlanes( bitmap, myflags );
* short err;
*
* INPUTS: struct BitMap *bitmap; pointer to initialized bitmap
* ULONG myflags; flags for routine
*
* DESCRIPTION: Deallocate memory for a bitmap's bitplanes.
* Number of bitplanes determined from bitmap.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeBitPlanes
*/
/*
* NAME: getDefaultColors
*
* SYNOPSIS: colortable = getDefaultColors();
* USHORT *colortable;
*
* DESCRIPTION: Get pointer to the default color table.
*
* RESULTS: Returns pointer to the default color table,
* or NULL if there is none.
*/
/*
* NAME: setColors
*
* SYNOPSIS: error = setColors( screen, colortable, colors );
* short error;
*
* INPUTS: struct Screen *screen; pointer to Intuition screen
* USHORT *colortable; or use NULL for default color table
* SHORT colors; number of colors to set
*
* DESCRIPTION: Set the colors of an Intuition screen.
*
* RESULTS: Returns non-zero on error (eg. if default color table
* requested but not large enough).
*/
/*
* NAME: checkColors
*
* SYNOPSIS: err = checkColors( screen, colors );
* short err;
*
* INPUTS: struct Screen *screen; pointer to Intuition screen
* SHORT colors; number of colors to check
*
* DESCRIPTION: Check colors of an Intuition screen by writing "hi!" in
* every color on the screen.
*
* Note: This is intended for "debug" purposes, as it will
* overwrite the screen's display.
*
* RESULTS: Returns non-zero on error.
*/
/*
* NAME: c_init
*
* SYNOPSIS: err = c_init();
* short err;
*
* DESCRIPTION: Initialize the communication interface software.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_open
*/
/*
* NAME: c_open
*
* SYNOPSIS: err = c_open( parms );
* short err;
*
* INPUTS: struct c_parameters *parms; serial setup parameters
*
* DESCRIPTION: Open the communications channel to the serial device.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_setup, c_init
*/
/*
* NAME: c_setup
*
* SYNOPSIS: err = c_setup( parms );
* short err;
*
* INPUTS: struct c_parameters *parms; serial setup parameters
*
* DESCRIPTION: Set the parameters that configure the serial port for
* communication.
* The different modes for serial configuration are not set in
* this function. They are only done in c_open.
*
* NOTE: the serial port must already be successfully opened by
* c_open and there should be no pending commands on the port.
*
* RESULTS: Returns a non-zero error code (see shandler.h) upon error.
*
* SEE ALSO: c_open
*/
/*
* NAME: c_getc
*
* SYNOPSIS: err = c_getc( charptr );
* short err;
*
* INPUTS: char *charptr; pointer to location to put character
*
* DESCRIPTION: Get a single character from the serial channel, with a
* "large" timeout.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_gets, c_getline, c_emptyc
*/
/*
* NAME: c_emptyc
*
* SYNOPSIS: err = c_emptyc();
* short err;
*
* DESCRIPTION: Flush the buffer, with a "small" timeout.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_getc, c_gets, c_getline
*/
/*
* NAME: c_putc
*
* SYNOPSIS: err = c_putc( character );
* short err;
*
* INPUTS: char character; character to send
*
* DESCRIPTION: Send one character to the serial channel.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_puts
*/
/*
* NAME: c_gets
*
* SYNOPSIS: err = c_gets( buffer, num_to_get );
* short err;
*
* INPUTS: char *buffer; buffer to store characters
* SHORT num_to_get; number of characters to get
*
* DESCRIPTION: Get the specified number of characters from
* the input channel and places them in the buffer.
* Note: does NOT stop reading on a '\0', nor is a '\0' appended.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_getc, c_getline
*/
/*
* NAME: c_getline
*
* SYNOPSIS: err = c_getline( buffer, num_to_get );
* short err;
*
* INPUTS: char *buffer; buffer to store characters
* SHORT num_to_get; number of characters to get
*
* DESCRIPTION: Get up to the specified number of characters,
* or until the end-of-line character is found,
* from the input channel and place them in the buffer.
* The default end-of-line character is 0x0d (CR) (check
* gimmelib/shandler.h to be sure), but this can be changed
* using the c_setEOL() routine.
* Note: the end-of-line character is kept in the buffer
* and NO '\0' is appended.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_setEOL, c_getc, c_gets
*/
/*
* NAME: c_setEOL
*
* SYNOPSIS: err = c_setEOL( eol_character )
* short err;
*
* INPUTS: char eol_character; new end-of-line character
*
* DESCRIPTION: Set the end-of-line character for use with c_getline().
* Note: the end-of-line character must be changed (if desired)
* after each c_open().
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_getline, c_open
*/
/*
* NAME: c_puts
*
* SYNOPSIS: err = c_puts( buffer, num_to_put );
* short err;
*
* INPUTS: char *buffer;
* SHORT num_to_put;
*
* DESCRIPTION: Send the specified number of characters to the serial port
* starting at the location pointed to by buffer.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_putc
*/
/*
* NAME: c_close
*
* SYNOPSIS: err = c_close();
* short err;
*
* DESCRIPTION: Close the communications channel.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_init, c_open
*/
/*
* NAME: c_done
*
* SYNOPSIS: err = c_done();
* short err;
*
* DESCRIPTION: De-initialize the communication interface software,
* i.e. tell it you are completely done with it.
*
* RESULTS: Returns a non-zero code on error (see gimmelib/shandler.h).
*
* SEE ALSO: c_init, c_open, c_close
*/
/*
* NAME: copyDataImage
*
* SYNOPSIS: err = copyDataImage( data, image );
* short err;
*
* INPUTS: USHORT *data; pointer to start of data to copy
* struct Image *image; image to receive data
*
* DESCRIPTION: Copy the data into the image's data buffer (in chip memory).
* Note: the image must already have a data buffer.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeImage, copyImageData
*/
/*
* NAME: copyImageData
*
* SYNOPSIS: err = copyImageData( image, data );
* short err;
*
* INPUTS: struct Image *image; image to receive data
* USHORT *data; pointer to start of data to copy
*
* DESCRIPTION: Copy the image's actual data into a supplied buffer.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeImage, copyDataImage
*/
/*
* NAME: copyBorder
*
* SYNOPSIS: border = copyBorder( memheadptr, oldborder, numbord, myflags );
* struct Border *border;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* struct Border *oldborder; border to copy (first of list)
* SHORT numbord; # of borders to copy, -1 for all
* ULONG myflags; flags for this routine
*
* DESCRIPTION: Copy numbord Border structs beginning with oldborder.
* A numbord of -1 means all the borders in the list.
*
* The flags define how much detail should be copied.
*
* NOTE: chainAllocMem is used and you
* should use chainFreeMem eventually to free the memory;
*
* RESULTS: Returns pointer to Border, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeBorder
*/
/*
* NAME: copyImage
*
* SYNOPSIS: image = copyImage( memheadptr, oldimage, numimage, myflags );
* struct Image *image;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* struct Image *oldimage; image to copy (first of list)
* SHORT numimage; # of images to copy, -1 for all
* ULONG myflags; flags for this routine
*
* DESCRIPTION: Copy numimage Image structs beginning with oldimage.
* A numimage of -1 means all the images in the list.
*
* The flags define how much detail should be copied.
*
* NOTE: chainAllocMem is used and you
* should use chainFreeMem eventually to free the memory;
*
* RESULTS: Returns pointer to Image, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeImage
*/
/*
* NAME: copyIntuiText
*
* SYNOPSIS: it = copyIntuiText( memheadptr, olditext, numitext, myflags );
* struct IntuiText *it;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* struct IntuiText *olditext; itext to copy (first of list)
* SHORT numitext; # of itexts to copy, -1 for all
* ULONG myflags; flags for this routine
*
* DESCRIPTION: Copy numitext IntuiText structs beginning with olditext.
* A numitext of -1 means all the IntuiTexts in the list.
*
* The flags define how much detail should be copied.
*
* NOTE: chainAllocMem is used and you
* should use chainFreeMem eventually to free the memory;
*
* RESULTS: Returns pointer to IntuiText, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeIntuiText
*/
/*
* NAME: copyMenuItem
*
* SYNOPSIS: item = copyMenuItem( memheadptr, olditem, numitem, numsub,
* myflags );
* struct MenuItem *item;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* struct MenuItem *olditem; item to copy (first of list)
* SHORT numitem; #items to copy, -1 for all
* SHORT numsub; #subitems to copy, -1 for all
* ULONG myflags; flags for this routine
*
* DESCRIPTION: Copy numitem MenuItem structs beginning with olditem.
* A numitem of -1 means all the items in the list.
* For each MenuItem copied, numsub subitems will be copied as
* well (a numsub of -1 means all subitems).
*
* The flags define how much detail should be copied.
*
* NOTE: chainAllocMem is used and you
* should use chainFreeMem eventually to free the memory;
*
* RESULTS: Returns pointer to MenuItem, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeMenuItem
*/
/*
* NAME: copyMenu
*
* SYNOPSIS: menu = copyMenu( memheadptr, oldmenu, nummenu, numitem,
* numsub, myflags );
* struct Menu *menu;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* struct Menu *oldmenu; menu to copy (first of list)
* SHORT nummenu; #menus to copy, -1 for all
* SHORT numitem; #menus to copy, -1 for all
* SHORT numsub; #submenus to copy, -1 for all
* ULONG myflags; flags for this routine
*
* DESCRIPTION: Copy nummenu Menu structs beginning with oldmenu.
* A nummenu of -1 means all the menus in the list.
* For each Menu copied, numitem menuitems will be copied as
* well (a numitem of -1 means all menuitems) via copyMenuItem
* using numsub for the number of subitems to copy.
*
* The flags define how much detail should be copied.
*
* NOTE: chainAllocMem is used and you
* should use chainFreeMem eventually to free the memory;
*
* RESULTS: Returns pointer to Menu, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeMenu, copyMenuItem
*/
/*
* NAME: makeDBuf
*
* SYNOPSIS: err = makeDBuf( screen, bmptr );
* short err;
*
* INPUTS: struct Screen *screen; ptr to single-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
*
* DESCRIPTION: Change a single-buffered Intuition screen into a
* double-buffered screen.
* If you already have your own bitmap for the secondary buffer,
* bmptr should point to the bitmap pointer;
* otherwise bmptr should point to a NULL pointer, in which case
* a bitmap of the same depth/width/height as the screen is
* dynamically created, and the pointer to this bitmap is
* returned in *bmptr.
*
* Note: you must not alter the bitmap pointer placed in *bmptr.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: unmakeDBuf, swapDBuf
*/
/*
* NAME: unmakeDBuf
*
* SYNOPSIS: err = unmakeDBuf( screen, bmptr, bm );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
* struct BitMap *bm; ptr to bitmap to be freed
*
* DESCRIPTION: Changes a double-buffered screen [as made by makeDBuf]
* back into a single-buffered screen.
* The screen's buffers are swapped if necessary to ensure that
* a CloseScreen() will work properly.
* If bm is non-NULL, the bitmap will be freed (de-allocated);
* this is intended primarily to be used to free the bitmap that
* was created by makeDBuf if you did not previously have
* a bitmap for the secondary buffer.
*
* Note: the screen and bmptr parameters should be exactly the
* same as those given to makeDBuf.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBuf, swapDBuf
*/
/*
* NAME: swapDBuf
*
* SYNOPSIS: err = swapDBuf( screen, minterm );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* SHORT minterm; minterm for the copy
*
* DESCRIPTION: Switch the display and draw buffers for the screen.
* The minterm is used to specify the type of blit used to copy
* the new displayed buffer (source) to the new hidden/drawing
* buffer (dest).
* Some common minterms are:
* 0x000 - clear destination
* 0x0c0 - vanilla copy (result: source only)
* 0x0a0 - no copy (result: dest only)
*
* Note: this routine hums along fine if the screen is not
* actually double-buffered, doing no swap and no copy.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBuf, unmakeDBuf
*/
/*
* NAME: makeDBufQuick
*
* SYNOPSIS: err = makeDBufQuick( screen, bmptr, lcprptr, scprptr );
* short err;
*
* INPUTS: struct Screen *screen; ptr to single-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
* struct cprlist **lcprptr; ptr to (long) copper list pointer
* struct cprlist **scprptr; ptr to (short) copper list pointer
*
* DESCRIPTION: Change a single-buffered Intuition screen into a
* double-buffered screen.
* If you already have your own bitmap for the secondary buffer,
* bmptr should point to the bitmap pointer;
* otherwise bmptr should point to a NULL pointer, in which case
* a bitmap of the same depth/width/height as the screen is
* dynamically created, and the pointer to this bitmap is
* returned in *bmptr.
*
* Note: you must not alter the bitmap pointer placed in *bmptr.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: unmakeDBufQuick, swapDBufQuick
*/
/*
* NAME: unmakeDBufQuick
*
* SYNOPSIS: err = unmakeDBufQuick( screen, bmptr, bm,
* lcprptr, scprptr );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
* struct BitMap *bm; ptr to bitmap to be freed
* struct cprlist **lcprptr; ptr to (long) copper list pointer
* struct cprlist **scprptr; ptr to (short) copper list pointer
*
* DESCRIPTION: Changes a double-buffered screen [as made by makeDBufQuick]
* back into a single-buffered screen.
* The screen's buffers are swapped if necessary to ensure that
* a CloseScreen() will work properly.
* If bm is non-NULL, the bitmap will be freed (de-allocated);
* this is intended primarily to be used to free the bitmap that
* was created by makeDBufQuick if you did not previously have
* a bitmap for the secondary buffer.
*
* Note: the screen and bmptr parameters should be exactly the
* same as those given to makeDBufQuick.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBufQuick, swapDBufQuick
*/
/*
* NAME: swapDBufQuick
*
* SYNOPSIS: err = swapDBufQuick( screen, minterm, lcprptr, scprptr );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* SHORT minterm; minterm for the copy
* struct cprlist **lcprptr; ptr to (long) copper list pointer
* struct cprlist **scprptr; ptr to (short) copper list pointer
*
* DESCRIPTION: Switch the display and draw buffers for the screen.
* The minterm is used to specify the type of blit used to copy
* the new displayed buffer (source) to the new hidden/drawing
* buffer (dest).
* Some common minterms are:
* 0x000 - clear destination
* 0x0c0 - vanilla copy (result: source only)
* 0x0a0 - no copy (result: dest only)
*
* Note: this routine hums along fine if the screen is not
* actually double-buffered, doing no swap and no copy.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBufQuick, unmakeDBufQuick
*/
/*
* NAME: makeDBufVQuick
*
* SYNOPSIS: err = makeDBufVQuick( screen, bmptr );
* short err;
*
* INPUTS: struct Screen *screen; ptr to single-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
*
* DESCRIPTION: Change a single-buffered Intuition screen into a
* double-buffered screen.
* If you already have your own bitmap for the secondary buffer,
* bmptr should point to the bitmap pointer;
* otherwise bmptr should point to a NULL pointer, in which case
* a bitmap of the same depth/width/height as the screen is
* dynamically created, and the pointer to this bitmap is
* returned in *bmptr.
*
* Note: you must not alter the bitmap pointer placed in *bmptr.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: unmakeDBufVQuick, swapDBufVQuick
*/
/*
* NAME: unmakeDBufVQuick
*
* SYNOPSIS: err = unmakeDBufVQuick( screen, bmptr, bm );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* struct BitMap **bmptr; ptr to bitmap ptr for second buffer
* struct BitMap *bm; ptr to bitmap to be freed
*
* DESCRIPTION: Changes a double-buffered screen [as made by makeDBufVQuick]
* back into a single-buffered screen.
* The screen's buffers are swapped if necessary to ensure that
* a CloseScreen() will work properly.
* If bm is non-NULL, the bitmap will be freed (de-allocated);
* this is intended primarily to be used to free the bitmap that
* was created by makeDBufVQuick if you did not previously have
* a bitmap for the secondary buffer.
*
* Note: the screen and bmptr parameters should be exactly the
* same as those given to makeDBufVQuick.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBufVQuick, swapDBufVQuick
*/
/*
* NAME: swapDBufVQuick
*
* SYNOPSIS: err = swapDBufVQuick( screen, minterm );
* short err;
*
* INPUTS: struct Screen *screen; ptr to double-buffered screen
* SHORT minterm; minterm for the copy
*
* DESCRIPTION: Switch the display and draw buffers for the screen.
* The minterm is used to specify the type of blit used to copy
* the new displayed buffer (source) to the new hidden/drawing
* buffer (dest).
* Some common minterms are:
* 0x000 - clear destination
* 0x0c0 - vanilla copy (result: source only)
* 0x0a0 - no copy (result: dest only)
*
* Note: this routine hums along fine if the screen is not
* actually double-buffered, doing no swap and no copy.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: makeDBufVQuick, unmakeDBufVQuick
*/
/*
* NAME: makeDualPlayfield
*
* SYNOPSIS: err = makeDualPlayfield( screen, ri, reldepth );
* short err;
*
* INPUTS: struct Screen *screen; ptr to single-playfield screen
* struct RasInfo *ri; ptr to RasInfo for second playfield
* SHORT reldepth; depth of second playfield relative
* to first playfield (0 or -1)
*
* DESCRIPTION: Change a single-playfield Intuition screen into a
* dual-playfield screen.
* Fully initializes the RasInfo struct pointed at by ri,
* and links it into the screen's RasInfo.
* A bitmap of the appropriate depth and same width/height will
* be dynamically created - the pointer is returned in ri->BitMap
* The possible depth combinations are limited (see RKM), but
* essentially:
* - the first playfield can be at most depth 3
* - the second playfield must have same depth or 1 less.
* Therefore "reldepth" must be 0 or -1.
* NOTE: present default: the first playfield is given video
* priority over the second playfield (though you can set the
* PFBA flag yourself if you do it right - CAUTION!).
*
* Note: you must have opened the screen using OpenScreen()
* without specifying DUALPF in the NewScreen's Flags field before
* calling this routine to keep things consistent (1.2 Intuition
* does not support opening/closing DUALPF screens properly).
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: unmakeDualPlayfield
*/
/*
* NAME: unmakeDualPlayfield
*
* SYNOPSIS: err = unmakeDualPlayfield( screen );
* short err;
*
* INPUTS: struct Screen *screen; pointer to dual-playfield screen
*
* DESCRIPTION: Changes a dual-playfield screen [as made by makeDualPlayfield]
* back into a single-playfield screen.
*
* NOTE: The bitmap *currently* used for the second-playfield is
* de-allocated, making the second playfield's RasInfo's BitMap
* pointer invalid. This will be the same bitmap that was
* allocated by makeDualPlayfield ONLY if you don't play
* around with the second-playfield's RasInfo's BitMap pointer.
*
* Note: you must call this routine before you do a CloseScreen()
* to keep things consistent (1.2 Intuition does not fully support
* opening/closing DUALPF screens properly).
*
* RESULTS: Returns non-zero on error (eg screen is NULL or screen is not
* dual-playfield).
*
* SEE ALSO: makeDualPlayfield
*/
/*
* NAME: gimmeFont
*
* REQUISITES: struct DiskfontBase *DiskfontBase; properly initialized
*
* SYNOPSIS: textfont = gimmeFont( textattr );
* struct TextFont *textfont;
*
* INPUTS: struct TextAttr *textattr; ptr to font description
*
* DESCRIPTION: Load specified font from disk (check in memory first).
* NOTE: the textattr may be altered to reflect actual font found.
*
* NOTE: you must have a global variable named DiskfontBase,
* declared as a "struct DiskfontBase *", already initialized by
* by opening the diskfont.library with code similar to the
* following:
* struct DiskfontBase *DiskfontBase;
* DiskfontBase = (struct DiskfontBase *)
* OpenLibrary("diskfont.library", 0L);
* { check for NULL pointer returned on error }
*
* RESULTS: Returns TextFont or NULL on error.
* The TextAttr's ta_YSize and ta_Style fields are altered to
* reflect those of the actual font found if successful.
*
* SEE ALSO: gimmeFontLazy, getRidOfFont
*/
/*
* NAME: gimmeFontLazy
*
* REQUISITES: struct DiskfontBase *DiskfontBase; properly initialized
*
* SYNOPSIS: textfont = gimmeFontLazy( name, size );
* struct TextFont *textfont;
*
* INPUTS: UBYTE *name; name of desired font
* UWORD size; y-size of desired font
*
* DESCRIPTION: Load specified font from disk (check in memory first).
* NOTE: a similar font may be used if the exact font is not found.
*
* NOTE: you must have a global variable named DiskfontBase --
* see gimmeFont for information on how to initialize it.
*
* RESULTS: Returns TextFont or NULL on error.
*
* SEE ALSO: gimmeFont, getRidOfFont
*/
/*
* NAME: getRidOfFont
*
* SYNOPSIS: err = getRidOfFont( textfont );
* short err;
*
* INPUTS: struct TextFont *textfont; pointer to TextFont
*
* DESCRIPTION: Releases access to a disk font obtained via gimmeFont(Quick).
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeFont, gimmeFontLazy
*/
/*
* NAME: getRidOfGadgets
*
* SYNOPSIS: err = getRidOfGadgets( firstgadget );
* short err;
*
* INPUTS: struct Gadget *firstgadget; pointer to first Gadget
*
* DESCRIPTION: Frees memory allocated for each gadget in chain, starting
* with firstgadget, using chainFreeMem.
*
* NOTE: uses a gadget's UserData field as pointer to head of
* memory-chain, as returned by chainAllocMem and set by the
* other gimme-gadget routines.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: chainAllocMem, chainFreeMem, gimmeXXXGadget
*/
/*
* NAME: gimmeBoolGadget
*
* REQUISITES: struct GfxBase *GfxBase; properly initialized - but only if
* ysize == -1, !window && !textattr
*
* SYNOPSIS: gp = gimmeBoolGadget( window, id, left, top, xsize, ysize,
* s, s2, textattr, myflags );
* struct Gadget *gp;
*
* INPUTS: struct Window *window; window for gadget, or NULL
* USHORT id; non-zero id for gadget
* SHORT left; left offset in pixels
* SHORT top; top offset in pixels
* SHORT xsize; total width in pixels, or -1
* SHORT ysize; total height in pixels, or -1
* UBYTE *s; main text string
* UBYTE *s2; auxiliary text string, or NULL
* struct TextAttr *textattr; pointer to font, or NULL
* ULONG myflags; flags for the routine
*
* DESCRIPTION: Allocate and initialize a boolean Gadget structure,
* including a border.
* The border is created appropriately enough to enclose
* the string nicely. Note: this routine succeeds even if no
* border was allocated (check gp->GadgetRender for a non-NULL
* value if you want to be sure that a border was allocated).
*
* NOTE: For text (with a border), not an image.
*
* If the window is non-NULL, some further customization of the
* gadget is done; notably the FgPen, BgPen and DrawMode of the
* window's rastport are used.
* If xsize or ysize are non-positive (use -1), appropriate
* value(s) are calculated to enclose the string nicely.
* If the auxiliary string s2 is NULL, a *hit select* boolean
* gadget is constructed, otherwise a *toggle select* boolean
* gadget is constructed -- NOTE: due to the odd nature of the
* toggle-selected text, you must use toggleBoolGadget upon
* receiving the GADGETDOWN message to effect the toggle visibly
* in the window.
*
* If xsize is non-positive and s2 is non-NULL,
* the border is constructed to enclose the longer string nicely
* and the shorter string is centred in the box accordingly,
* without residue of the longer string when displayed (toggled).
* The textattr can be NULL to use the default font.
* The flags (see gimmelib/postext.h) allow special effects for
* positioning the gadget:
* - if xsize is "real" (positive):
* - x-flags cause the final gadget box to be placed
* accordingly within the region from left to left+xsize
* (eg. x-centre means the gadget is centred within
* xsize bits, offset by the left parm)
* - if xsize is -1 (non-postive):
* - the left parameter is taken to be the coordinate
* as specified by the x-flags
* (eg. x-centre means the left parm is actually the
* centre of the gadget in the x-direction)
* - the y-flags always modify the meaning of the top parm
* (eg. y-centre means the top parm is actually the
* centre of the gadget in the y-direction)
*
* NOTE: The auxiliary string's IntuiText is stored in
* the gadget's SelectRender field. You must leave this field
* alone, which also means do not use the GADGHIMAGE flag.
* The two strings can be switched and displayed by using
* toggleBoolGadget.
*
* NOTE: To remove the border permanently, do something similar
* to the following (with appropriate error checking):
* gp = gimmeBoolGadget(...);
* pluckChainMem( &gp->UserData, gp->GadgetRender );
* gp->GadgetRender = NULL;
* (the pluckChainMem is not absolutely necessary, since the
* border's memory would be freed when getRidOfGadgets is called)
*
* If all goes well, the head pointer to chained memory for the
* gadget and its other required structures is stored in the
* gp->UserData field. You must preserve this pointer!!
* If you need to use the UserData yourself, be sure to save
* gp->UserData somewhere safe after calling this routine.
* When you are done with the gadget you must ensure that the
* chained memory head pointer is restored into gp->UserData
* before you call getRidOfGadgets.
*
* NOTE: if you supply an auxiliary string s2 to create a toggle
* gadget, and window is non-NULL, then the window's rastport's
* drawmode should be JAM2 otherwise visual confusion may occur
* upon toggling and/or clearing.
*
* RESULTS: Returns pointer to boolean gadget, or NULL.
* Note: The gadget is NOT added to the window.
*
* SEE ALSO: toggleBoolGadget, getRidOfGadgets, gimmeBoolImageGadget
*/
/*
* NAME: gimmeBoolImageGadget
*
* SYNOPSIS: gp = gimmeBoolImageGadget( window, id, left, top, depth, width,
* height, myflags, dep2, wid2, ht2 );
* struct Gadget *gp;
*
* INPUTS: struct Window *window; window for gadget, or NULL
* USHORT id; non-zero id for gadget
* SHORT left; left offset in pixels
* SHORT top; top offset in pixels
* SHORT depth; depth of primary image
* SHORT width; width of primary image, in pixels
* SHORT height; height of primary image, in pixels
* ULONG myflags; flags for the routine
* SHORT dep2; depth of secondary image, or <= 0
* SHORT wid2; width of secondary image, or <= 0
* SHORT ht2; height of secondary image, or <= 0
*
* DESCRIPTION: Allocate and initialize a boolean Gadget structure,
* including Image structure(s) and data memory (via gimmeImage)
* for the primary image, and for the secondary image if the
* 3 size specifications for it are strictly positive.
* Note that for the primary image, you can specify zero for any
* of its dimensions so that an Image structure but no data memory
* is allocated.
*
* NOTE: For images, not text.
*
* If the secondary image's dimensions are improper, a *hit select*
* boolean gadget is constructed, otherwise a *toggle select*
* boolean gadget is constructed.
* NOTE: if you wish the secondary image to merely be highlighting
* imagery for a *hit select* boolean gadget, you should do this:
* gp->Activation = RELVERIFY;
* after this function call (note your two images should overlap
* exactly to keep things clean on the screen).
* NOTE: if you wish to toggle manually, do the following:
* gp->Flags = GADGIMAGE | GADGHNONE;
* gp->Activation = GADGIMMEDIATE;
* after this function call. Then, when you receive a GADGETDOWN
* message, call toggleBoolGadget to switch the imagery. This is
* similar to the system toggle select except that toggleBoolGadget
* erases the current image before drawing the "alternate" image
* and redefines the gadget's select box for the new image.
*
* The flags (see gimmelib/postext.h) alter the meaning of the
* top and left parameters, with respect to the size of the
* primary image.
*
* If all goes well, the head pointer to chained memory for the
* gadget and its other required structures is stored in the
* gp->UserData field. You must preserve this pointer!!
* If you need to use the UserData yourself, be sure to save
* gp->UserData somewhere safe after calling this routine.
* When you are done with the gadget you must ensure that the
* chained memory head pointer is restored into gp->UserData
* before you call getRidOfGadgets.
*
* RESULTS: Returns pointer to boolean gadget, or NULL.
* Note: The gadget is NOT added to the window.
*
* SEE ALSO: toggleBoolGadget, getRidOfGadgets, gimmeBoolGadget
*/
/*
* NAME: gimmePropGadget
*
* SYNOPSIS: gp = gimmePropGadget( window, id, left, top, xsize, ysize,
* label, textattr, activflags, propflags );
* struct Gadget *gp;
*
* INPUTS: struct Window *window; window for gadget, or NULL
* USHORT id; non-zero id for gadget
* SHORT left; left offset in pixels
* SHORT top; top offset in pixels
* SHORT xsize; total width in pixels
* SHORT ysize; total height in pixels
* UBYTE *label; gadget label, or NULL
* struct TextAttr *textattr; pointer to font, or NULL
* ULONG activflags; gadget Activation flags
* ULONG propflags; flags for PropInfo
*
* DESCRIPTION: Allocate and initialize a string Gadget structure,
* including PropInfo and optional label.
* If the window is non-NULL, some further customization of the
* gadget is done; notably the FgPen, BgPen and DrawMode of the
* window's rastport are used for the label.
* The xsize and ysize parms define the size of the actual,
* gadget, NOT including the (optional) label.
* Note: if xsize and/or ysize are non-positive, you must set
* the appropriate flags (such as GRELWIDTH, GRELHEIGHT) in the
* gadget's Flags field after this routine returns.
* If label is non-NULL, a label is set up with the actual prop
* gadget to the right of the label.
* The textattr can be NULL to use the default font.
* The activflags are set in the gadget's Activation field.
* The propflags are set in the gadget's PropInfo structure - see
* gimmePropInfo for details on how these flags are used.
* Note: if you wish to change the knob imagery to your own, do
* something similar to the following after this routine:
* gp->GadgetRender = (APTR) <your image or border>;
* ((struct PropInfo *)gp->SpecialInfo)->Flags &= ~AUTOKNOB;
* gp->Flags &= ~GADGIMAGE; ;; ONLY if you want a BORDER
*
* If all goes well, the head pointer to chained memory for the
* gadget and its other required structures is stored in the
* gp->UserData field. You must preserve this pointer!!
* If you need to use the UserData yourself, be sure to save
* gp->UserData somewhere safe after calling routine.
* When you are done with the gadget you must ensure that the
* chained memory head pointer is restored into gp->UserData
* before you call getRidOfGadgets.
*
* RESULTS: Returns pointer to prop gadget, or NULL.
* Note: The gadget is NOT added to the window.
*
* SEE ALSO: getRidOfGadgets, gimmePropInfo
*/
/*
* NAME: gimmePropInfo
*
* SYNOPSIS: pi = gimmePropInfo( memheadptr, flags );
* struct PropInfo *pi;
*
* INPUTS: void **memheadptr; pointer to chained-memory head
* ULONG flags; flags for PropInfo
*
* DESCRIPTION: Allocate and initialize a PropInfo structure.
*
* The PropInfo's flags are set to "AUTOKNOB | flags"
* which you can change after this function returns.
*
* The allocated memory is chained to the memory chain pointed
* at by memheadptr using chainAllocMem.
* Eventually chainFreeMem should be called on the memhead.
*
* RESULTS: Returns pointer to PropInfo, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem
*/
/*
* NAME: gimmeStringGadget
*
* REQUISITES: struct GfxBase *GfxBase; properly initialized - but only
* needed if !window && !textattr
*
* SYNOPSIS: gp = gimmeStringGadget( window, id, left, top, width, maxbuf,
* s, label, textattr, activflags );
* struct Gadget *gp;
*
* INPUTS: struct Window *window; window for gadget, or NULL
* USHORT id; non-zero id for gadget
* SHORT left; left offset in pixels
* SHORT top; top offset in pixels
* SHORT width; total width in pixels
* SHORT maxbuf; maximum buffer size including '\0'
* UBYTE *s; initial text string
* UBYTE *label; gadget label, or NULL
* struct TextAttr *textattr; pointer to font, or NULL
* ULONG activflags; gadget Activation flags
*
* DESCRIPTION: Allocate and initialize a string Gadget structure,
* including border, StringInfo, buffers and optional label.
* If the window is non-NULL, some further customization of the
* gadget is done; notably the FgPen, BgPen and DrawMode of the
* window's rastport are used for the label and border.
* The border is width pixels wide and high enough to enclose
* the string nicely. Note: this routine succeeds even if no
* border was allocated (check gp->GadgetRender for a non-NULL
* value if you want to be sure that a border was allocated).
* If you want to remove the border, do something similar to this:
* pluckChainMem( &gp->UserData, gp->GadgetRender );
* gp->GadgetRender = NULL;
* If label is non-NULL, a label is set up with the actual string
* gadget to the right of the label.
* NOTE: the width includes space taken by the label (if any).
* The textattr can be NULL to use the default font.
* The activflags are set in the gadget's Activation field.
*
* Note: the actual string is rendered in the screen's font.
* This is normally the font specified when the screen is opened.
* However, doing a SetFont() on the screen's rastport to alter the
* font (and even if you change the screen's Font field as well)
* will cause the string gadget to be handled a little awkwardly:
* the initial rendering will occur in the screen's original font,
* and once the gadget is selected, the "new" font will be used for
* rendering; however, the "old" font's character width is used to
* determine which character in the string gadget is clicked on,
* which may result in some visual confusion.
*
* If all goes well, the head pointer to chained memory for the
* gadget and its other required structures is stored in the
* gp->UserData field. You must preserve this pointer!!
* If you need to use the UserData yourself, be sure to save
* gp->UserData somewhere safe after calling routine.
* When you are done with the gadget you must ensure that the
* chained memory head pointer is restored into gp->UserData
* before you call getRidOfGadgets.
*
* RESULTS: Returns pointer to string gadget, or NULL.
* Note: The gadget is NOT added to the window.
*
* SEE ALSO: getRidOfGadgets, gimmeStringInfo
*/
/*
* NAME: gimmeStringInfo
*
* SYNOPSIS: si = gimmeStringInfo( memheadptr, bufsize, s, flags );
* struct StringInfo *si;
*
* INPUTS: void **memheadptr; pointer to chained memory head
* SHORT bufsize; maximum size including nullchar
* UBYTE *s; initial string
* ULONG flags; flags for StringInfo: only LONGINT checked
*
* DESCRIPTION: Allocate and initialize a StringInfo structure,
* including space for the main and undo buffers.
* If the LONGINT flag is set in flags, the initial string s
* should consist of a valid long integer in ascii format.
*
* The allocated memory is chained to the memory chain pointed
* at by memheadptr using chainAllocMem.
* Eventually chainFreeMem should be called on the memhead.
*
* RESULTS: Returns pointer to StringInfo, or NULL.
*
* SEE ALSO: chainAllocMem, chainFreeMem
*/
/*
* NAME: clearGadgets
*
* SYNOPSIS: err = clearGadgets( firstgadget, window, req, numgad );
* short err;
*
* INPUTS: struct Gadget *firstgadget; first gadget to clear
* struct Window *window; gadget's window
* struct Requester *req; gadget's requester, or NULL
* SHORT numgad; # of gadgets to clear, or -1
*
* DESCRIPTION: Clear the imagery of numgad gadgets in a window, starting with
* firstgadget.
* If numgad is negative, the whole list starting with firstgadget
* is cleared. If numgad is zero, no gadgets are cleared.
* NOTE: the gadget cannot be in a requester, so if the req
* parameter is non-NULL, the gadget(s) will not be cleared and
* an error returned.
* NOTE: The requester is ignored unless the first gadget has the
* REQGADGET gadget type flag set; you should ensure that this flag
* is consistently set or clear in each gadget in the list.
* It is assumed that all gadgets are in the requester if the first
* one is.
* NOTE: the gadget(s) will be cleared regardless of whether it
* actually exists in the window or requester.
*
* If RefreshGadgets() is called after this routine, the gadget(s)
* will be displayed normally.
*
* NOTE: active "invisible" gadgets may look odd; especially a
* previously activated string gadget and when you click somewhere
* else, the cursor in the string gadget is redrawn by Intuition.
* The cause of this may be the following: if a string gadget has
* the GADGHCOMP flag set, then the cursor is drawn when a
* RefreshGadgets() is done (possibly only if the gadget is in a
* requester).
*
* RESULTS: Returns non-zero on error.
* Note that the Gadget's display on screen is cleared to the
* background colour of the window's rastport immediately.
*
* SEE ALSO: RefreshGList, RemoveGList, AddGList
*/
/*
* NAME: toggleBoolGadget
*
* SYNOPSIS: error = toggleBoolGadget( window, gadget, req );
* short error;
*
* INPUTS: struct Window *window; gadget's window
* struct Gadget *gadget; boolean gadget to toggle
* struct Requester *req; gadget's requester, or NULL
*
* DESCRIPTION: Toggle a boolean gadget's text OR image, by switching it
* with the alternative text or image respectively.
*
* If it is a text gadget:
* NOTE: the alternative text pointer is originally stored in
* the gadget's SelectRender field by gimmeBoolGadget.
* You must leave this field alone, which also means do not use
* the GADGHIMAGE flag.
* If it is an image gadget:
* the current ("old") image is erased before the new image is
* drawn, and the select box of the gadget is altered to the
* dimensions of the new image (this works perfectly only if
* the image's top left corner is the same as the gadget's).
*
* RESULTS: Returns non-zero on error.
* Note: this routine only refreshes this gadget.
*
* SEE ALSO: gimmeBoolGadget, clearGadgets
*/
/*
* NAME: findGadget
*
* SYNOPSIS: gp = findGadget( firstgadget, id );
* struct Gadget *gp;
*
* INPUTS: struct Gadget *firstgadget; pointer to Gadget list
* USHORT id; id of Gadget being sought
*
* DESCRIPTION: Search linked list of Gadgets, starting with firstgadget,
* for the first Gadget with GadgetID equal to id.
*
* RESULTS: Returns pointer to Gadget matching the id, or NULL if none.
*/
/*
* NAME: findMyFirstGadget
*
* SYNOPSIS: gp = findMyFirstGadget( window, id );
* struct Gadget *gp;
*
* INPUTS: struct Gadget *firstgadget; pointer to Gadget list
* USHORT id; threshold id to skip over
*
* DESCRIPTION: Search linked list of Gadgets, starting with firstgadget,
* for the first Gadget with GadgetID strictly greater than id.
*
* RESULTS: Returns pointer to first Gadget with a greater id,
* or NULL if none.
*/
/*
* NAME: gimmeGraph
*
* SYNOPSIS: gr = gimmeGraph( newgraph, bitmap, areainfo, tmpras );
* GRAPH *gr;
*
* INPUTS: struct NEWGRAPH *newgraph; ptr to initialized NEWGRAPH
* struct BitMap *bitmap; bitmap pointer, or NULL
* struct AreaInfo *areainfo; areainfo pointer, or NULL
* struct TmpRas *tmpras; tmpras pointer, or NULL
*
* DESCRIPTION: Create and initialize a GRAPH structure,
* according to the specifications in the newgraph.
* The axes and title will be rendered immediately unless the
* appropriate flag is set, in which case you can modify the GRAPH
* structure, then call drawGraphAxes yourself after this routine.
*
* NOTE: currently the graph routines only properly support 1st
* quadrant graphing with a right-handed coordinate system
* (ie the axes should increase in value up and to the right).
* If you use scrolling (via DELTA flags), you should avoid
* values that fall exactly on an axis.
*
* If the newgraph's rastport pointer is non-NULL, the actual
* rastport is copied into the graph structure, leaving the
* rastport pointed at by the newgraph forever untouched;
* otherwise the graph's rastport is initialized by InitRastPort().
* If bitmap is non-NULL, the bitmap pointer is copied into the
* graph's rastport's bitmap pointer.
* NOTE: if you specified a rastport in the newgraph and no bitmap
* parameter, the bitmap in that rastport will be used; otherwise
* you MUST specify a valid bitmap pointer as a parameter.
*
* The areainfo and tmpras parameters go together, and are used
* only if either or both FILLTO flags are set.
* If areainfo (or tmpras) is non-NULL, the pointer will be set
* in the graph's rastport. If areainfo (or tmpras) is NULL, then
* an AreaInfo struct and vector buffer (or TmpRas struct and a
* raster the same size as the bitmap) are allocated for you.
* NOTE: if you specify the same areainfo and/or tmpras for two
* or more graphs, you must ensure that any addToGraph using FILLTO
* is not done concurrently, since technically the areainfo/tmpras
* structs should be unique for each graph.
*
* The graphing routines are intended to be reasonably flexible;
* you can alter the fonts and colours for the various titles and
* labvels (title refers to words; label refers to the numbers on
* an axis) after this routine -- currently, the labels default to
* use the same font as their respective titles; the axes' title
* colours default to the same as the title colour; and the axes'
* label colours default to the axes colour.
* NOTE: if you wish to use different fonts for the labels, you
* can set the appropriate graph's textfont pointer, for example
* by assigning the title-textfont to the x-label-textfont, or
* setting it to NULL to use the "default" font;
* however, it is recommended that you do not introduce new fonts
* unless you know how to handle fonts properly (in particular
* do not play around with the three title font pointers).
*
* Points are added to the graph dynamically using addToGraph.
*
* See gimmelib/graph.h for descriptions of the various graphing
* structures and flags; note that some of the newgraph flags
* apply to how axis information is used.
*
* Note: all allocated memory, including the GRAPH struct itself,
* is chained and the header is stored in the GRAPH's memhead
* field, which is used by getRidOfGraph to deallocate memory.
* You should use getRidOfGraph to free all the memory allocated
* by this routine.
*
* RESULTS: Returns a pointer to a GRAPH, or NULL if anything went wrong.
*
* SEE ALSO: addToGraph, getRidOfGraph, gimmeFont, drawGraphAxes,
* chainAllocMem
*/
/*
* NAME: getRidOfGraph
*
* SYNOPSIS: err = getRidOfGraph( graph );
* short err;
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
*
* DESCRIPTION: Close a graph, freeing any allocated memory and releasing
* access to fonts accessed by gimmeGraph.
* May clear the graph first if the flags dictate it.
*
* RESULTS: Returns non-zero on error.
*
* SEE ALSO: gimmeGraph, clearGraph, getRidOfFont, chainFreeMem
*/
/*
* NAME: clearGraph
*
* SYNOPSIS: clearGraph( graph );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
*
* DESCRIPTION: Clear a graph.
* Effectively this means drawing the axes, labels and titles
* in the background colour and then clearing the rectangular
* region of the graph (bounded by the axes).
* Note: the graph struct is otherwise unchanged after this call.
*
* SEE ALSO: gimmeGraph, getRidOfGraph
*/
/*
* NAME: resetGraph
*
* SYNOPSIS: resetGraph( graph );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
*
* DESCRIPTION: Resets a graph to the beginning.
* Effectively this means clearing the graph, re-initializing
* appropriate variables such as first and last point, undoing
* the effects of any scrolling, etc. and redrawing the "empty"
* graph if the graph's flags dictate it.
*
* SEE ALSO: gimmeGraph, clearGraph, drawGraphAxes, getRidOfGraph
*/
/*
* NAME: drawGraphAxesOnly
*
* SYNOPSIS: drawGraphAxesOnly( graph );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
*
* DESCRIPTION: Draw the axes (lines only -- not labels) of a graph.
* Existing axes (if any) are NOT cleared first.
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph
*/
/*
* NAME: drawGraphAxes
*
* SYNOPSIS: drawGraphAxes( graph );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
*
* DESCRIPTION: Draw the axes including labels, titles and graph title
* of a graph in appropriate fonts, colours and positions.
* This means main title centred over the graph quad, the x-title
* centred under the x-axis (and labels), and the y-axis vertical
* and centred left of the y-axis (and labels).
*
* Existing axes, labels and titles (if any) are NOT cleared first.
*
* RESULTS: Returns the maximum width required for the labels (not titles).
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph, drawGraphTitle,
* drawGraphXtitle, drawGraphYtitle
*/
/*
* NAME: drawGraphTitle
*
* SYNOPSIS: drawGraphTitle( graph, xoff, yoff, myflags );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
* SHORT xoff; offset from y-axis in pixels
* SHORT yoff; offset from x-axis in pixels
* ULONG myflags; flags ala positionText
*
* DESCRIPTION: Draw the main title for a graph in the appropriate font
* and colour at (xoff, yoff) relative to the graph origin
* as modified by myflags via positionText.
* NOTE: yoff is positive upwards from the x-axis, and negative
* downwards (opposite to the normal rastport offsets).
*
* Existing title (if any) is NOT cleared first.
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph, positionText
*/
/*
* NAME: drawGraphXtitle
*
* SYNOPSIS: drawGraphXtitle( graph, xoff, yoff, myflags );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
* SHORT xoff; offset from y-axis in pixels
* SHORT yoff; offset from x-axis in pixels
* ULONG myflags; flags ala positionText
*
* DESCRIPTION: Draw the title for a graph's x-axis in the appropriate font
* and colour at (xoff, yoff) relative to the graph origin
* as modified by myflags via positionText.
* NOTE: yoff is positive upwards from the x-axis, and negative
* downwards (opposite to the normal rastport offsets).
*
* Existing title (if any) is NOT cleared first.
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph, positionText
*/
/*
* NAME: drawGraphYtitle
*
* SYNOPSIS: drawGraphYtitle( graph, xoff, yoff, myflags );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
* SHORT xoff; offset from y-axis in pixels
* SHORT yoff; offset from x-axis in pixels
* ULONG myflags; flags ala positionText
*
* DESCRIPTION: Draw the title for a graph's y-axis in the appropriate font
* and colour at (xoff, yoff) relative to the graph origin
* as modified by myflags via positionText.
* NOTE: yoff is positive upwards from the x-axis, and negative
* downwards (opposite to the normal rastport offsets).
*
* Existing y-title (if any) is NOT cleared first.
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph, positionText
*/
/*
* NAME: graphWriteLabel
*
* SYNOPSIS: graphWriteLabel( graph, myflags, first, last, step )
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
* ULONG myflags; flags for this routine
* SHORT first; low coordinate to start at
* SHORT last; high coordinate to end at
* SHORT step; fixed step size, 0 for automagic size
*
* DESCRIPTION: Draw the labels for one axis of a graph in the appropriate font
* and colour (note: does not draw axis title).
*
* Automagically labels an axis between the coords first and last
* inclusive (the first and last parms should be reasonable -- not
* checked).
* If step is zero (0) then labels for first and last are rendered,
* and as many labels as reasonably possible are placed starting
* next to first and going towards just before last, leaving a
* reasonable amount of space between labels.
* If step is strictly positive, then a label is written for the
* coords: first, first+step, first+step+step,...,last
* (note that if last is not n-steps away from first then a label
* for last itself will not be drawn).
* Note: the step size should not be too small (not checked).
*
* NOTE: exact label "wording" depend on the axis scale and certain
* graph flags.
*
* Warning: this is a very recursive routine (unless you give
* a fixed step size).
*
* RESULTS: Returns the maximum width of the labels for this axis.
*
* SEE ALSO: drawGraphAxes, gimmeGraph, clearGraph
*/
/*
* NAME: addToGraph
*
* SYNOPSIS: addToGraph( graph, x, y );
*
* INPUTS: GRAPH *graph; pointer to a GRAPH structure
* SHORT x; x coordinate of new point to add
* SHORT y; y coordinate of new point to add
*
* DESCRIPTION: Add a point to the graph, rendered according to the flags
* in the graph structure.
* This includes lines, block fills etc. as well as scrolling
* if necessary.
* Note: the point is moved to the boundary of the rectangular
* region defined by the origin and the size of the axes
* if the point would fall outside of this boundary.
*
* NOTE: if either FILLTO flag is set in the graph, the proper
* initialized AreaInfo and TmpRas structures must exist
* (gimmeGraph takes care of this if either FILLTO flag was set
* when it was called) otherwise crashes will occur.
*
* SEE ALSO: gimmeGraph, getRidOfGraph, drawGraphAxes
*/
/*
* NAME: addInputHandler
*
* SYNOPSIS: ioreq = addInputHandler( handler, data, pri, name );
* struct IOStdReq *ioreq;
*
* INPUTS: void (*handler)(); address of handler routine
* APTR data; pointer to data area for handler
* BYTE pri; priority for the handler
* UBYTE *name; name for input handler, or NULL
*
* DESCRIPTION: Add an input handler to the system.
* The priority indicates the priority level of the input handler;
* note that Intuition operates at priority fifty (50).
* The name is optional.
*
* Your "real" input handler routine should be written as if called
* from the following C-language statement (see manuals):
* newEventChain = handler( oldEventChain, data );
* This isn't entirely true... the routine "handler" should
* actually expect the oldEventChain and data parameters
* in A0 and A1 respectively (see manuals).
* IF your real input handler is written in C, make your real
* input handler act like the above C-language call and also
* you must set up an interface routine similar to the following:
* #asm
* _handler:
* MOVEM.L D2/D3/A4/A6,-(sp) ; save some registers
* MOVEM.L A0/A1,-(sp) ; set up parms for C
* JSR _myrealhandler
* LEA 8(sp),sp ; pop parms
* MOVEM.L (sp)+,D2/D3/A4/A6 ; restore registers
* RTS ; return in D0
* #endasm
* then call this routine using "handler", NOT "myrealhandler",
* as the handler parameter.
*
* NOTE: your "real" input handler may have to do a geta4() as
* the first thing (or the Lattice equivalent) to set up a special
* pointer for small code/data models.
*
* NOTE: do not fiddle with the iorequest; in particular, you
* must not alter the ioreq->io_Data pointer.
*
* RESULTS: Returns a pointer to a IOStdReq, or NULL if unsuccessful.
*
* SEE ALSO: removeInputHandler
*/
/*
* NAME: removeInputHandler
*
* SYNOPSIS: err = removeInputHandler( ioreq );
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.